import loginModel from "../../model/login/loginModel";
const { uuid } = require('uuidv4');
const bcrypt = require('bcryptjs');

export default class loginService {
    
	// 登录
	async signIn(params) {
		// 查询用户信息
		let userInfo:any = await new loginModel().signIn(params);
		if(userInfo){
			if(bcrypt.compareSync(params.loginpwd, userInfo.loginpwd)){
				// 更新用户登陆时间
				await new loginModel().updateLoginTime(userInfo.id);
				// 查询用户按钮权限列表
				if(userInfo.roleid){
					let authBtnList:any = await new loginModel().getAuthBtnList(userInfo.roleid);
					userInfo.authBtnList = authBtnList.map(item => item.btnPower)
				}else{
					userInfo.authBtnList = []
				}
			}else{
				userInfo = {
					msg: '密码不正确！'
				}
			}
		}else{
			userInfo = {
				msg: '用户不存在！'
			}
		}
		return userInfo
	}
	// 注册
	async register(params) {
		// 查询账号是否存在
		let res:any = await new loginModel().getLoginUser(params.username);
		if(res.length){
			if(res[0].status===3){
				return { msg: "该账号已注册，请勿重复注册！" }
			}else{
				return { msg:  "该账号已存在，请更换账号注册！" }
			}
		}else{
			let obj = {
				id: uuid(),
				loginUser: params.username,
				loginPwd: params.password,
				createAt: new Date(),
				status: 3
			}
			return await new loginModel().register(obj);
		}
	}
	// 获取用户权限
	async getUserMenu(params) {
		let roleMenu:any = await new loginModel().getUserMenu(params);
		for(let menu of roleMenu){
				let meta:any = await new loginModel().getMeta(menu.id);
				if(meta.length){
						menu.meta = meta[0];
				}
		}
		let treeList = await this.transTree(roleMenu);
		return treeList;
	}
	// list转tree
	async transTree(data) {
		let result:any = [];
		let map = {};
		if (!Array.isArray(data)) {
			//验证data是不是数组类型
			return [];
		}
		data.forEach((item) => {
			//建立每个数组元素id和该对象的关系
			map[item.id] = item; //这里可以理解为浅拷贝，共享引用
		});
		data.forEach((item) => {
			let parent = map[item.pid]; //找到data中每一项item的爸爸
			if (parent) {
				//说明元素有爸爸，把元素放在爸爸的children下面
				(parent.children || (parent.children = [])).push(item);
			} else {
				//说明元素没有爸爸，是根节点，把节点push到最终结果中
				result.push(item); //item是对象的引用
			}
		});
		return result; //数组里的对象和data是共享的
	}
	// 根据token查询用户信息
	async getUserInfoById(userId) {
		// 查询用户信息
		let userInfo:any = await new loginModel().getUserInfoById(userId);
		if(userInfo){
			// 查询用户按钮权限列表
			let authBtnList:any = await new loginModel().getAuthBtnList(userInfo.roleid);
			userInfo.authBtnList = authBtnList.map(item => item.btnPower)
		}
		return userInfo
	}
    
}